﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<map>
#include<string>
using namespace std;
//C++98的{}初始化
struct Point
{
	int _x;
	int _y;
};
class Date
{
	public :
	Date(int year = 1, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{
		cout << "Date(int year, int month, int day)" << endl;
	} 
	Date(const Date& d)
		: _year(d._year)
		, _month(d._month)
		, _day(d._day)
	{
		cout << "Date(const Date& d)" << endl;
	}
	// 一切皆可用列表初始化，且可以不加=
private:
	int _year;
	int _month;
	int _day;
};
void test1()
{
	std::initializer_list<int> mylist;
	mylist = { 10, 20, 30 };
	cout << sizeof(mylist) << endl;
	// 这⾥begin和end返回的值initializer_list对象中存的两个指针
	// 这两个指针的值跟i的地址跟接近，说明数组存在栈上
	int i = 0;
	cout << mylist.begin() << endl;
	cout << mylist.end() << endl;
	cout << &i << endl;
	// {}列表中可以有任意多个值
	// 这两个写法语义上还是有差别的，第⼀个v1是直接构造，
	// 第⼆个v2是构造临时对象+临时对象拷⻉v2+优化为直接构造
	vector<int> v1({ 1,2,3,4,5 });
	vector<int> v2 = { 1,2,3,4,5 };
	const vector<int>& v3 = { 1,2,3,4,5 };
	// 这⾥是pair对象的{}初始化和map的initializer_list构造结合到⼀起⽤了
	map<string, string> dict = { {"sort", "排序"}, {"string", "字符串"} };
	// initializer_list版本的赋值⽀持
	v1 = { 10,20,30,40,50 };
}
void test2()
{
	//C++98的{}初始化
	int array1[] = { 1, 2, 3, 4, 5 };
	int array2[5] = { 0 };
	Point p = { 1, 2 };
	//C++11{}初始化
	int x1 = { 1 };
	int x2{ 3 };
	Date(2025, 9, 23);
	Date d1{ 2022,12,31 };
	Date d2 = { 2022,12,31 };
	Date d3 = Date{ 2022,12,31 };
	const Date d4{ 2022,12,31 };//三个参数
	vector<int> v1{ 1,2,3,4,5 ,6,7,8,9,10 };//多参数初始化
	auto v2 = { 1,2,3,4,5 ,6,7,8,9,10 };//自动推导类型
	cout << sizeof(v2) << endl;
	cout << typeid(v2).name() << endl;
}
//新型的{}初始化
string func()
{
	return {};//表示返回一个空字符串
}
void test3()
{
	string s1("111111");
	string s2 = "111111";
	string s3={ "111111" };
	string s4 { "111111" };
	string s5(10,'f');
	string s6 = { 10, 'f' };
	string s7 = {};//空字符串
	int a=0;
	int b = {};
	int c{};

}
int main()
{
	//test1();
	//test2();

	return 0;
}


















